package com.dqx.haoqiu.mvp.common.base;

import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.dqx.haoqiu.mvp.R;
import com.dqx.haoqiu.mvp.utils.Navigation;
import com.dqx.haoqiu.mvp.widget.ErrorDialog;
import com.dqx.haoqiu.mvp.widget.LoadingDialog;
import com.xmjs.baselibrary.base.IBasePresenter;
import com.xmjs.baselibrary.base.IBaseView;
import com.xmjs.baselibrary.base.activity.lib.LibBaseActivity;
import com.xmjs.baselibrary.utils.LocalCache;
import com.xmjs.baselibrary.utils.SP;
import com.xmjs.baselibrary.utils.ToastUtil;

import javax.inject.Inject;

import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static com.dqx.haoqiu.mvp.common.constant.IConstants.FONT_SCALE;

/**
 * 该基类的作用：（这个基类可以根据具体的项目业务来定义和扩展）
 * 1.展示公共的标题栏
 * 2.显示/隐藏共用的Loading提示
 * 3.显示/隐藏错误提示
 * 4.登录成功的回调预处理
 * 5.展示公共的进球列表
 * 6.支持沉浸式
 */
public class BaseActivity<P extends IBasePresenter> extends LibBaseActivity implements IBaseView,
        ErrorDialog.OnListener {
    private View v_base_state_bar;
    private View v_base_body;
    private ImageView iv_base_left;
    private TextView tv_base_title;
    private TextView tv_base_right;
    private LinearLayout ll_base_root;
    private RelativeLayout rl_base_title_bar;
    private RelativeLayout rl_base_body;
    private RelativeLayout rl_base_left;

    private LoadingDialog mDialog;
    private ErrorDialog errorDialog;

    @Inject
    public P presenter;

    @Inject
    SP mSP;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_base);

        //BaseActivity的style样式实际已经实现了沉浸式，这里的v_base_state_bar用来填充沉浸的状态栏高度，
        //当supporTimmersion()为true时，设置v_base_state_bar的高度为0以便达到沉浸；
        //当supporTimmersion()为false时，设置v_base_state_bar的高度为状态栏的高度，以便用来填充被沉浸的高度
        v_base_state_bar = findViewById(R.id.v_base_state_bar);
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v_base_state_bar.getLayoutParams();
        params.height = supporTimmersion() ? 0 : getStatusBarHeight();
        v_base_state_bar.setBackgroundResource(statusBarResource());

        //背景
        ll_base_root = findViewById(R.id.ll_base_root);
        ll_base_root.setBackgroundResource(setBackgroundColor());

        //头部标题栏
        iv_base_left = findViewById(R.id.iv_base_left);
        tv_base_title = findViewById(R.id.tv_base_title);
        tv_base_right = findViewById(R.id.tv_base_right);
        rl_base_left = findViewById(R.id.rl_base_left);
        rl_base_title_bar = findViewById(R.id.rl_base_title_bar);
        rl_base_title_bar.setVisibility(setTitleBarVisable() ? View.VISIBLE : View.GONE);
        rl_base_title_bar.setBackgroundResource(setTitleBarColor());
        tv_base_title.setVisibility(setTitleVisable() ? View.VISIBLE : View.GONE);
        tv_base_title.setText(setTitle());
        tv_base_title.setTextColor(getResources().getColor(setTitleTxtColor()));
        rl_base_left.setOnClickListener(v -> onLeftBtnClick());
        iv_base_left.setVisibility(setLeftBtnVisable() ? View.VISIBLE : View.GONE);
        iv_base_left.setBackgroundResource(setLeftBtnDrawable());
        tv_base_right.setVisibility(setRightBtnVisable() ? View.VISIBLE : View.GONE);
        tv_base_right.setText(setRightBtnText());
        tv_base_right.setTextColor(getResources().getColor(setRightTextColor()));
        tv_base_right.setCompoundDrawablesWithIntrinsicBounds(setRightBtnDrawable(), 0, 0, 0);
        tv_base_right.setOnClickListener(v -> onRightBtnClick());

        //body部分
        rl_base_body = findViewById(R.id.rl_base_body);
    }

    @Override
    public void setContentView(int resId) {
        v_base_body = getLayoutInflater().inflate(resId, null);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout
                .LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
        if (null != rl_base_body) rl_base_body.addView(v_base_body, params);
    }

    /**
     * 是否支持沉浸式
     *
     * @return
     */
    public boolean supporTimmersion() {
        return false;
    }

    /**
     * 动态设置是否沉浸
     *
     * @param isTimmersion
     */
    public void setTimmersion(boolean isTimmersion) {
        v_base_state_bar.getLayoutParams().height = isTimmersion ? 0 : getStatusBarHeight();
    }

    /**
     * 是否显示标题栏
     *
     * @return
     */
    public boolean setTitleBarVisable() {
        return true;
    }

    /**
     * 获取标题栏
     *
     * @return
     */
    public View getTitleBar() {
        return rl_base_title_bar;
    }

    /**
     * 设置标题栏背景色
     *
     * @return
     */
    public int setTitleBarColor() {
        return R.color.color_ffffff;
    }

    /**
     * 是否显示标题
     *
     * @return
     */
    public boolean setTitleVisable() {
        return true;
    }

    /**
     * 设置标题文本
     *
     * @return
     */
    public String setTitle() {
        return "";
    }

    /**
     * 设置标题文本的字体颜色
     *
     * @return
     */
    public int setTitleTxtColor() {
        return R.color.color_171717;
    }

    /**
     * 是否显示左边按钮
     *
     * @return
     */
    public boolean setLeftBtnVisable() {
        return true;
    }

    /**
     * 设置左边按钮的背景图
     *
     * @return
     */
    public int setLeftBtnDrawable() {
        return R.mipmap.ic_apply_back;
    }

    /**
     * 是否显示右边按钮
     *
     * @return
     */
    public boolean setRightBtnVisable() {
        return false;
    }

    /**
     * 设置右边按钮的文本
     *
     * @return
     */
    public String setRightBtnText() {
        return "";
    }

    /**
     * 设置右边按钮的文本字体颜色
     *
     * @return
     */
    public int setRightTextColor() {
        return R.color.color_theme;
    }

    /**
     * 设置右边按钮的图标
     *
     * @return
     */
    public int setRightBtnDrawable() {
        return 0;
    }

    /**
     * 左边按钮的点击事件
     */
    public void onLeftBtnClick() {
        finish();
    }

    /**
     * 右边按钮的点击事件
     */
    public void onRightBtnClick() {

    }

    /**
     * 设置状态栏颜色
     *
     * @return
     */
    public int statusBarResource() {
        return R.color.white;
    }

    /**
     * 设置整个页面的背景色
     *
     * @return
     */
    public int setBackgroundColor() {
        return R.color.color_ffffff;
    }

    /**
     * 设置状态栏高亮模式
     *
     * @return
     */
    @Override
    public boolean isStatusBarLightMode() {
        return super.isStatusBarLightMode();
    }

    /**
     * 改变背景色
     *
     * @param color
     */
    public void changeBackgroundColor(int color) {
        ll_base_root.setBackgroundResource(color);
    }

    /**
     * 改变标题文案
     *
     * @param title
     */
    public void changeTitle(String title) {
        tv_base_title.setText(title);
    }

    /**
     * 改变标题字体大小
     *
     * @param textSize
     */
    public void changeTitleSize(float textSize) {
        tv_base_title.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize);
    }

    /**
     * 获取右边按钮控件
     *
     * @return
     */
    public TextView getRightBtn() {
        return tv_base_right;
    }

    /**
     * 显示加载对话框
     *
     * @param cancelable 是否可以取消
     */
    @Override
    public void showLoadingView(boolean cancelable) {
        if (mDialog == null)
            mDialog = new LoadingDialog(this);
        mDialog.setCancelable(cancelable);
        mDialog.show();
    }

    /**
     * 隐藏加载对话框
     */
    @Override
    public void hideLoadingView() {
        if (mDialog != null)
            mDialog.dismiss();
    }

    /**
     * 重新登录
     */
    @Override
    public void onReLogin() {
        LocalCache.clear(mSP);
        Navigation.openLogin(this);
    }

    /**
     * 当接口请求出现错误，需要重新加载页面或重新请求接口时，请重写该的方法
     */
    @Override
    public void onReload() {

    }

    /**
     * 吐司
     *
     * @param res
     */
    @Override
    public void toast(int res) {
        ToastUtil.getInstance().toast(res);
    }

    /**
     * 吐司
     *
     * @param msg
     */
    @Override
    public void toast(String msg) {
        ToastUtil.getInstance().toast(msg);
    }

    /**
     * 显示页面错误提示
     *
     * @param imagResId 图片资源id
     * @param errorText 错误文案
     * @param btnText   按钮文案
     */
    @Override
    public void showError(int imagResId, String errorText, String btnText) {
        if (errorDialog != null) {
            errorDialog.dismiss();
            errorDialog = null;
        }
        if (errorDialog == null) {
            errorDialog = new ErrorDialog(this)
                    .setImage(imagResId)
                    .setErrorText(errorText)
                    .setBtnVisibility(VISIBLE)
                    .setBtnText(btnText)
                    .setListener(this);
            errorDialog.show();
        }
    }

    /**
     * 显示页面错误提示
     *
     * @param imagResId      图片资源id
     * @param errorResId 错误文案资源id
     * @param btnTextResId   按钮文案资源id
     */
    @Override
    public void showError(int imagResId, int errorResId, int btnTextResId) {
        if (errorDialog != null) {
            errorDialog.dismiss();
            errorDialog = null;
        }
        if (errorDialog == null) {
            errorDialog = new ErrorDialog(this)
                    .setImage(imagResId)
                    .setErrorText(getString(errorResId))
                    .setBtnVisibility(VISIBLE)
                    .setBtnText(getString(btnTextResId))
                    .setListener(this);
            errorDialog.show();
        }
    }

    /**
     * 显示页面错误提示
     *
     * @param imagResId    图片资源id
     * @param errorText    错误文案
     * @param btnTextResId 按钮文案资源id
     */
    @Override
    public void showError(int imagResId, String errorText, int btnTextResId) {
        if (errorDialog != null) {
            errorDialog.dismiss();
            errorDialog = null;
        }
        if (errorDialog == null) {
            errorDialog = new ErrorDialog(this)
                    .setImage(imagResId)
                    .setErrorText(errorText)
                    .setBtnVisibility(VISIBLE)
                    .setBtnText(getString(btnTextResId))
                    .setListener(this);
            errorDialog.show();
        }
    }

    /**
     * 显示空提示
     *
     * @param isShow    是否显示
     * @param imagResId 图片资源id
     * @param hintText  提示文案
     */
    @Override
    public void showEmpty(boolean isShow, int imagResId, String hintText) {
        if (errorDialog != null) {
            errorDialog.dismiss();
            errorDialog = null;
        }
        if (errorDialog == null && isShow) {
            errorDialog = new ErrorDialog(this)
                    .setImage(imagResId)
                    .setErrorText(hintText)
                    .setBtnVisibility(GONE)
                    .setListener(this);
            errorDialog.show();
        }
    }

    /**
     * 显示空提示
     *
     * @param isShow        是否显示
     * @param imagResId     图片资源id
     * @param hintResId 提示文案资源id
     */
    @Override
    public void showEmpty(boolean isShow, int imagResId, int hintResId) {
        if (errorDialog != null) {
            errorDialog.dismiss();
            errorDialog = null;
        }
        if (errorDialog == null && isShow) {
            errorDialog = new ErrorDialog(this)
                    .setImage(imagResId)
                    .setErrorText(getString(hintResId))
                    .setBtnVisibility(GONE)
                    .setListener(this);
            errorDialog.show();
        }
    }

    /**
     * 显示默认的空提示
     *
     * @param isShow 是否显示
     */
    public void showEmpty(boolean isShow) {
        showEmpty(isShow, R.mipmap.ic_me_follow_sebg, getString(R.string.no_data));
    }

    /**
     * 重新该方法，控制APP加载的字体大小
     *
     * @return
     */
    @Override
    public Resources getResources() {
        Resources res = super.getResources();
        Configuration config = res.getConfiguration();
        float fontScale = new SP(this).getFloat(FONT_SCALE);
        config.fontScale = fontScale <= 0 ? 1 : fontScale;
        res.updateConfiguration(config, res.getDisplayMetrics());
        return res;
    }

}
